#include "FilterUtils.h"
#include <stdexcept>

// 均值滤波
cv::Mat FilterUtils::meanBlur(const cv::Mat& src, int ksize) {
    if (ksize <= 0) throw std::invalid_argument("Kernel size must be positive");
    cv::Mat dst;
    cv::blur(src, dst, cv::Size(ksize, ksize));
    return dst;
}

// 高斯滤波
cv::Mat FilterUtils::gaussianBlur(const cv::Mat& src, int ksize, double sigmaX, double sigmaY) {
    if (ksize <= 0 || ksize % 2 == 0) throw std::invalid_argument("Kernel size must be positive and odd");
    cv::Mat dst;
    cv::GaussianBlur(src, dst, cv::Size(ksize, ksize), sigmaX, sigmaY);
    return dst;
}

// 中值滤波
cv::Mat FilterUtils::medianBlur(const cv::Mat& src, int ksize) {
    if (ksize <= 1 || ksize % 2 == 0) throw std::invalid_argument("Kernel size must be odd and > 1");
    cv::Mat dst;
    cv::medianBlur(src, dst, ksize);
    return dst;
}

// 双边滤波
cv::Mat FilterUtils::bilateralFilter(const cv::Mat& src, int d, double sigmaColor, double sigmaSpace) {
    if (d <= 0) throw std::invalid_argument("Diameter must be positive");
    cv::Mat dst;
    cv::bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);
    return dst;
}

// 自定义卷积滤波
cv::Mat FilterUtils::customFilter2D(const cv::Mat& src, const cv::Mat& kernel) {
    if (kernel.empty()) throw std::invalid_argument("Kernel cannot be empty");
    cv::Mat dst;
    cv::filter2D(src, dst, -1, kernel);
    return dst;
}
